/**
 * 前端解密工具类
 * 用于解密gzip+base64编码的数据
 * 使用浏览器原生API，不依赖外部库
 */

/**
 * 将base64编码的gzip数据解压缩为原始字符串
 * @param {string} base64GzipData base64编码的gzip数据
 * @returns {Promise<string>} 解压缩后的原始字符串
 */
export const decompressFromGzipBase64 = async (base64GzipData) => {
  try {
    // Base64解码
    const binaryString = atob(base64GzipData)
    const bytes = new Uint8Array(binaryString.length)
    for (let i = 0; i < binaryString.length; i++) {
      bytes[i] = binaryString.charCodeAt(i)
    }

    // 使用浏览器原生的CompressionStream API进行gzip解压缩
    if (typeof CompressionStream !== 'undefined') {
      // 现代浏览器支持
      const stream = new ReadableStream({
        start(controller) {
          controller.enqueue(bytes)
          controller.close()
        }
      })
      
      const decompressedStream = stream.pipeThrough(new DecompressionStream('gzip'))
      const reader = decompressedStream.getReader()
      const chunks = []
      
      while (true) {
        const { done, value } = await reader.read()
        if (done) break
        chunks.push(value)
      }
      
      const decompressed = new Uint8Array(chunks.reduce((acc, chunk) => acc + chunk.length, 0))
      let offset = 0
      for (const chunk of chunks) {
        decompressed.set(chunk, offset)
        offset += chunk.length
      }
      
      return new TextDecoder().decode(decompressed)
    } else {
      // 降级方案：直接返回base64解码后的数据
      console.warn('浏览器不支持CompressionStream，返回原始解码数据')
      return new TextDecoder().decode(bytes)
    }
  } catch (error) {
    console.error('数据解压缩失败:', error)
    // 如果解压缩失败，尝试直接返回base64解码的数据
    try {
      const binaryString = atob(base64GzipData)
      return binaryString
    } catch (fallbackError) {
      throw new Error('数据解密失败: ' + error.message)
    }
  }
}

/**
 * 尝试解析JSON字符串
 * @param {string} jsonString JSON字符串
 * @returns {object|null} 解析后的对象，失败返回null
 */
export const tryParseJSON = (jsonString) => {
  try {
    return JSON.parse(jsonString)
  } catch (error) {
    console.warn('JSON解析失败:', error)
    return null
  }
}

/**
 * 格式化JSON数据
 * @param {object} data 要格式化的数据
 * @returns {string} 格式化后的JSON字符串
 */
export const formatJSON = (data) => {
  try {
    return JSON.stringify(data, null, 2)
  } catch (error) {
    console.error('JSON格式化失败:', error)
    return String(data)
  }
}

/**
 * 解密税务报送请求数据
 * @param {string} sjl 加密的数据内容
 * @param {string} ywlx 业务类型
 * @returns {Promise<object>} 解密后的数据对象
 */
export const decryptTaxReportData = async (sjl, ywlx) => {
  try {
    // 解密数据内容
    const decompressedData = await decompressFromGzipBase64(sjl)
    
    // 尝试解析为JSON
    const jsonData = tryParseJSON(decompressedData)
    
    return {
      ywlx: ywlx,
      sjl: jsonData || decompressedData,
      isJson: jsonData !== null,
      rawData: decompressedData
    }
  } catch (error) {
    console.error('解密税务报送数据失败:', error)
    throw new Error('解密失败: ' + error.message)
  }
}

/**
 * 检测数据是否为加密的税务报送数据
 * @param {string} data 要检测的数据
 * @returns {boolean} 是否为加密数据
 */
export const isEncryptedTaxData = (data) => {
  try {
    // 检查是否为base64编码
    if (typeof data !== 'string') return false
    
    // 尝试base64解码
    atob(data)
    
    // 检查长度是否合理（gzip压缩后的数据通常不会太短）
    return data.length > 100
  } catch (error) {
    return false
  }
}
